import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Esta clase representa a un menu que permite al usuario jugar por niveles.
 * 
 * @author Miguel Martinez Aguilar
 * @version 19 de Mayo del 2013
 */
public class MenuNiveles extends Actor
{
    // Declaracion de variables de instancia
    private Jugador[] jugador;// es un arreglo de 2 jugadores.
    private InicioJuego comenzar;// es el boton de inicio.
    private MenuJuego menu;// es el menu de juego.
    private ImagenM[] compet;// es un arreglo de 4 objetos de tipo ImagenM que representaran a los 4 jugadores.
    private ImagenM[] ganador;// es una arreglo de 3 objetos de tipo ImagenM que representaran a los ganadores.
    private int aux;// es un contador auxiliar que indica el numero de partidas jugadas.
    private int quiengano;// es una variable que juarda el numero del jugador que gano.
    private ScrollWorld mundo;// es una referencia al escenario movible.
    
    /**
     * Constructor de MenuNiveles.
     * @param mundo: un parametro que haga referencia al escenario movible.
     */
    public MenuNiveles(ScrollWorld mundo)
    {
        jugador = new Jugador[2];
        jugador[0] = null;
        jugador[1] = null;
        comenzar = null;
        this.menu = null;
        compet = new ImagenM[4];
        compet[0] = new ImagenM("usuario0.png");
        compet[1] = new ImagenM("primero0.png");
        compet[2] = new ImagenM("segundo0.png");
        compet[3] = new ImagenM("tercero0.png");
        ganador = new ImagenM[3];
        aux = 0;
        this.mundo = mundo;
        quiengano = 0;
    }  
    
    /**
     * Este metodo prepara otros elementos del inicio del menu de juego
     * @param menu: un menu principal que permite acceder a los jugadores.
     */
    public void prepara(MenuJuego menu) 
    {
        this.menu = menu;
        comenzar = new InicioJuego("comenzar",4,menu);
        mundo.setPaintOrder(MenuNiveles.class);
        mundo.addObject(comenzar,this.getX() + 100,this.getY() - 135);
        mundo.setPaintOrder(InicioJuego.class);
        for(int i = 0; i < 4; i++){
            if(compet[i] != null)mundo.addObject(compet[i],this.getX() - 150,this.getY() - 138 + (90 * i));
        }
        for(int i = 0; i < 3; i++){
            if(ganador[i] != null)mundo.addObject(ganador[i],this.getX() - 48 + (i * 100),this.getY() - 92 +(i * 70));
        }
    }
    
    /**
     * Este metodo quita las interfaces del menu de niveles
     * @param todo: un boleano que indica si se deben eliminar todas las interfaces o no.
     */
    public void quitarBotones(boolean todo) 
    {
        mundo.removeObject(comenzar);
        for(int i = 0; i < 4; i++)if(compet[i] != null)mundo.removeObject(compet[i]);
        for(int i = 0; i < 3; i++)if(ganador[i] != null)mundo.removeObject(ganador[i]);
        if(todo){
            this.quitarJugadores();
        }
        World escena = super.getWorld();
        if(todo)escena.removeObject(this);
        menu = null;
    }
    
    /**
     * Este metodo verifica si existen jugadores. <p>
     * regresa true si los 2 jugadores existen.
     */
    public boolean hayJugadores() 
    {
        return (jugador[0] != null && jugador[1] != null);
    }
    
    /**
     * Este metodo entrega el primer jugador. <p>
     * regresa el primer jugador.
     */
    public Jugador jugador1() 
    {
        return jugador[0];
    }
    
    /**
     * Este metodo entrega el segundo jugador. <p>
     * regresa el segundo jugador.
     */
    public Jugador jugador2() 
    {
        return jugador[1];
    }
    
    /**
     * Este metodo crea a los jugadores en turno
     */
    public void preparaJugadores()
    {
        this.quitarJugadores();
        if(aux == 0){
            jugador[0] = new Usuario("usuario");
            jugador[1] = new Primero();
        }
        if(aux == 1){
            if(quiengano == 0)jugador[0] = new Usuario("usuario");
            else jugador[0] = new Primero();
            jugador[1] = new Segundo();
        }
        if(aux == 2){
            if(quiengano == 0)jugador[0] = new Usuario("usuario");
            if(quiengano == 1)jugador[0] = new Primero();
            if(quiengano == 2)jugador[0] = new Segundo();
            jugador[1] = new Tercero();
        }
        this.agregaJugadores();
    }
    
    /**
     * Este metodo agrega los jugadores correspondientes
     */
    public void agregaJugadores()
    {
        if(aux < 3){
            mundo.addObject(jugador[0],this.getX(),this.getY() - 200);
            mundo.addObject(jugador[1],this.getX(),this.getY() - 200);
        }
    }
    
    /**
     * Este metodo quita a los jugadores del escenario
     */
    public void quitarJugadores()
    {
        if(jugador[0] != null){
            mundo.removeObject(jugador[0]);
            jugador[0] = null;
        }
        if(jugador[1] != null){
            mundo.removeObject(jugador[1]);
            jugador[1] = null;
        }
    }
    
    /**
     * Este metodo verifica al ganador de la partida
     * @param gan: un boleano que indica cual de los 2 jugadores fue el ganador.
     */
    public void quienGano(boolean gan)
    {
        if(aux < 3){
            if(gan){
                ganador[aux] = new ImagenM(jugador[0].getImage());
                quiengano = jugador[0].numJugador();
            }
            else{
                ganador[aux] = new ImagenM(jugador[1].getImage());
                quiengano = jugador[1].numJugador();
            }
            aux++;
        }
    }
}